home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 5817 / 5817.xpi / chrome / content / workerCsv.js < prev   
Text File  |  2010-02-11  |  8KB  |  269 lines

  1. var gStage = 0;
  2.  
  3. var tempStore = {
  4.   csvParams: null,
  5.   csvRecords: null,
  6.   columns: [],
  7.   queries: []
  8. };
  9.  
  10. onmessage = function(event) {
  11.   if (event.data) {
  12.     var params = event.data;
  13.     gStage = params.stage;
  14.     postMessage('Processing csv import stage ' + gStage);
  15.     switch (gStage) {
  16.     case 1:
  17.       var obj = readCsvContent(params);
  18.       postMessage(obj);
  19.       break;
  20.     case 2:
  21.       var obj = createAllQueries(params);
  22.       postMessage(obj);
  23.       break;
  24.     }
  25.   }
  26. };
  27.  
  28. function readCsvContent(csvParams) {
  29.   tempStore.csvParams = csvParams;
  30.  
  31.   var sData = readFile(csvParams.file, csvParams.charset);
  32.   postMessage('Read csv file: ' + sData.length + ' bytes');
  33.   tempStore.csvRecords = CsvToArray(sData, csvParams.separator);
  34.  
  35.   var iRows = tempStore.csvRecords.length;
  36.   postMessage('Parsed csv data: ' + iRows + ' records');
  37.  
  38.   if (iRows <= 0) {
  39.     var obj = {stage: gStage, success: 0, description: 'no rows found'};    return obj;  }
  40.  
  41.   tempStore.columns = [];
  42.   var aVals = tempStore.csvRecords[0];
  43.   if (csvParams.bColNames) {
  44.     for (var c = 0; c < aVals.length; c++) {
  45.       tempStore.columns.push(aVals[c]);
  46.     }
  47.   }
  48.   else {
  49.     for (var c = 1; c <= aVals.length; c++)
  50.       tempStore.columns.push("col_" + c);
  51.   }
  52.  
  53.   var obj = {stage: gStage, success: 1, description: '', tableName: csvParams.tableName, columns: tempStore.columns};
  54.   return obj;
  55. }
  56.  
  57. function createAllQueries(params) {
  58.   var aQueries = [];
  59.   var iOtherQueries = 0;
  60.   if (params.createTableQuery != "") {
  61.     aQueries.push(params.createTableQuery);
  62.      iOtherQueries = 1;
  63.   }
  64.  
  65.   var iRows = tempStore.csvRecords.length;
  66.   var iCols = tempStore.columns.length;
  67.   var bColNames = tempStore.csvParams.bColNames;
  68.  
  69.   var sQuery = "";
  70.  
  71.   for (var i = bColNames?1:0; i < iRows; i++) {
  72.     var aVals = tempStore.csvRecords[i];
  73.  
  74.     var iCol = 0;
  75.     var aInp = [];
  76.     var aBadLines = [];
  77.     var sNoValue = "''";
  78.     for (var c = 0; c < aVals.length; c++) {
  79.       if (aVals[c] != null)
  80.         aVals[c] = quote(aVals[c]);
  81.       else
  82.         aVals[c] = "null";
  83.  
  84.       aInp.push(aVals[c]);
  85.     }
  86.     
  87.     //if aInp has fewer values than expected, 
  88.     //complete the aInp array with empty strings.
  89.     while (aInp.length < iCols)
  90.       aInp.push(sNoValue);
  91.  
  92.     //aBadLines will not be empty only if their are more values than columns
  93.     if (aInp.length != iCols) {
  94.       aBadLines.push(i+1);
  95.       continue;
  96.     }
  97.     sVals = " VALUES (" + aInp.join(",") + ")";
  98.     sQuery = "INSERT INTO " + params.tableName + sVals;
  99.     aQueries.push(sQuery);
  100.     postMessage('Creating SQL statements: ' + aQueries.length + ' created');
  101.   }
  102.   var num = aQueries.length - iOtherQueries;
  103.   var obj = {stage: gStage, success: 1, description: '', numRecords: num, queries: aQueries, badLines: aBadLines};
  104.   return obj;}
  105.  
  106. function readFile(file, charset) {
  107.   var req = new XMLHttpRequest();
  108.   req.open('GET', file, false);
  109.   req.overrideMimeType('text/plain; charset='+charset);
  110.   req.send(null);
  111.   if(req.status == 0)
  112.     return req.responseText;
  113. }
  114.  
  115. //When there are 2 consecutive separators (,,) or a separator at the start of a line (^,) we treat them as having a null field in between. If separator is followed by newline (,\n) the treatment depends upon user option whether to ignore trailing commas. If not ignored, a null field is assumed after the trailing delimiter. However, lines which have no character in them (^\n) are ignored instead of the possible alternative of treating them as representative of a single null field. See Issue #324 too.
  116. function CsvToArray(input, separator) {
  117.   var re_linebreak = /[\n\r]+/
  118.  
  119.   var re_token = /[\"]([^\"]|(\"\"))*[\"]|[,]|[\n\r]|[^,\n\r]*|./g
  120.   if (separator == ";")
  121.     re_token = /[\"]([^\"]|(\"\"))*[\"]|[;]|[\n\r]|[^;\n\r]*|./g
  122.   if (separator == "|")
  123.     re_token = /[\"]([^\"]|(\"\"))*[\"]|[|]|[\n\r]|[^|\n\r]*|./g
  124.   if (separator == "\t")
  125.     re_token = /[\"]([^\"]|(\"\"))*[\"]|[\t]|[\n\r]|[^\t\n\r]*|./g
  126.  
  127.   //TODO: try using exec in a loop
  128.   var a = input.match(re_token);
  129.  
  130.   var token;
  131.   var line = [], allLines = [];
  132.   var tkSEPARATOR = 0, tkNEWLINE = 1, tkNORMAL = 2;
  133.   var tk = tkNEWLINE, tkp = tkNEWLINE;
  134.  
  135.   for (var i = 0; i < a.length; i++) {
  136.     tkp = tk;
  137.  
  138.     token = a[i];
  139.     
  140.     if (token == separator) {
  141.       tk = tkSEPARATOR;
  142.       //this separator is the first char in line or follows another separator
  143.       if (line.length == 0 || tkp == tkSEPARATOR) {
  144.         line.push(null);
  145.       }
  146.     }
  147.     else if (token == "\n" || token == "\r") {
  148.       tk = tkNEWLINE;
  149.       if (!tempStore.csvParams.ignoreTrailingDelimiter && tkp == tkSEPARATOR) {
  150.         line.push(null);
  151.       }
  152.       if (line.length > 0) {
  153.         allLines.push(line);
  154.         postMessage('Parsing csv data: ' + allLines.length + ' records');
  155.         line = [];
  156.       }
  157.     }
  158.     else { //field value
  159.       tk = tkNORMAL;
  160.       if (tkp != tkSEPARATOR) {
  161.         if (line.length > 0) {
  162.           allLines.push(line);
  163.           postMessage('Parsing csv data: ' + allLines.length + ' records');
  164.           line = [];
  165.         }
  166.       }
  167.       //remove quotes from both ends
  168.       if (token.length >= 2) {
  169.         var firstChar = token[0];
  170.         if (firstChar == '"' || firstChar == "'") {
  171.           if (token[token.length - 1] == firstChar) {
  172.             token = token.substring(1, token.length - 1);
  173.           }
  174.         }
  175.       }
  176.       line.push(token);
  177.     }
  178.   }
  179.  
  180.   return allLines;
  181. }
  182.  
  183. //http://www.bennadel.com/blog/1504-Ask-Ben-Parsing-CSV-Strings-With-Javascript-Exec-Regular-Expression-Command.htm
  184. function CsvToArray1(strData, strDelimiter) {
  185.   // Check to see if the delimiter is defined. If not,
  186.   // then default to comma.
  187.   strDelimiter = (strDelimiter || ",");
  188.  
  189.   // Create a regular expression to parse the CSV values.
  190.   var objPattern = new RegExp(
  191.     (  // Delimiters.
  192.       "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
  193.       // Quoted fields.
  194.       "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
  195.       // Standard fields.
  196.       "([^\"\\" + strDelimiter + "\\r\\n]*))"
  197.     ), "gi");
  198.  
  199.   // Create an array to hold our data. Give the array
  200.   // a default empty first row.
  201.   var arrData = [[]];
  202.  
  203.   // Create an array to hold our individual pattern
  204.   // matching groups.
  205.   var arrMatches = null;
  206.  
  207.   // Keep looping over the regular expression matches
  208.   // until we can no longer find a match.
  209.   while (arrMatches = objPattern.exec(strData)) {
  210.  
  211.     // Get the delimiter that was found.
  212.     var strMatchedDelimiter = arrMatches[1];
  213.      postMessage('delim: ' + arrData.length + ':' + strMatchedDelimiter);
  214.  
  215.     // Check to see if the given delimiter has a length
  216.     // (is not the start of string) and if it matches
  217.     // field delimiter. If id does not, then we know
  218.     // that this delimiter is a row delimiter.
  219.     if (strMatchedDelimiter.length &&
  220.       (strMatchedDelimiter != strDelimiter)) {
  221.  
  222.       // Since we have reached a new row of data,
  223.       // add an empty row to our data array.
  224.       arrData.push([]);
  225.       postMessage('Parsing csv data: ' + arrData.length + ' records');
  226.     }
  227.  
  228.     // Now that we have our delimiter out of the way,
  229.     // let's check to see which kind of value we
  230.     // captured (quoted or unquoted).
  231.     if (arrMatches[2]) {
  232.  
  233.       // We found a quoted value. When we capture
  234.       // this value, unescape any double quotes.
  235.       var strMatchedValue = arrMatches[2].replace(
  236.         new RegExp("\"\"", "g" ), "\"");
  237.      postMessage('value q: ' + arrData.length + ':' + strMatchedValue);
  238.     }
  239.     else {
  240.  
  241.       // We found a non-quoted value.
  242.       var strMatchedValue = arrMatches[3];
  243.      postMessage('value nq: ' + arrData.length + ':' + strMatchedValue);
  244.  
  245.       //next two lines by mkt to distinguish null from strings
  246.       if (strMatchedValue == undefined || strMatchedValue == null)
  247.         strMatchedValue = null;
  248.       else
  249.       if (strMatchedValue.length == 0)
  250.         strMatchedValue = null;
  251.     }
  252.  
  253.     // Now that we have our value string, let's add
  254.     // it to the data array.
  255.     arrData[arrData.length - 1].push(strMatchedValue);
  256.      postMessage('value: ' + arrData.length + ':' + strMatchedValue);
  257.   }
  258.  
  259.   // Return the parsed data.
  260.   return arrData;
  261. }
  262.  
  263. function quote(str) {
  264.   if (typeof str == "string")
  265.     str = str.replace("'", "''", "g");
  266.   return "'" + str + "'";
  267. }
  268.  
  269.